Grafana Cloudを使って産業機器のデータを可視化してみよう
本記事はクラスメソッド発 製造業 Advent Calendar 2024の18日目です。
こんにちは。製造ビジネステクノロジー部のakkyです。久しぶりの記事となってしまいました。
スマート工場を実現するための第一歩として、産業機器からデータを取得して可視化するということを取り組んでいる方もいらっしゃるのではないでしょうか。
今回は、Grafana Cloudを使って簡単にデータを可視化してみましょう。
Grafana Cloudを使うと別途データベースの用意をすることなくデータを蓄積し、可視化できます。しかも無料で出来ます!PoCには最適ではないかと思いませんか?
今回はNode-REDを利用して、できるだけコードを書かずにModbusで取得したデータを可視化する方法を紹介します。
Grafana Cloud
Grafanaは基本的にはITシステムのオブザーバビリティのためのソフトウェアですが、高い汎用性が特徴で、たとえばJAXAの月着陸衛星SLIMの監視などにも使用された実績があります。
そしてもちろん工場の可視化に使用した例もあります。
今回はGrafanaを使って産業機器の稼働状況データを可視化しましょう。
今回可視化するのは、機器から取得できるON/OFF信号や、モーターの回転数、電圧などの時系列の情報とします。
Grafanaはオープンソースソフトウェア版があるので自力でセットアップすることもできますが、簡単に始めるにはマネージドサービスを使うのが良いでしょう。
AWS(Amazon Managed Grafana)やAzure(Azure Managed Grafana)もマネージドサービスを提供していますが、今回はGrafana Cloudを使ってみました。これはGrafana開発元のGrafana Labsが提供するSaaSです。
フリーミアムモデルで提供されており、無料から使い始めることができます。
Mimirによるデータ保管
次にデータを保存するためのデータベースを考えます。
Grafanaは可視化のソフトウェアなので、表示するデータはデータベースから取得してくるというアーキテクチャになっています。通常は別途データベースを構築する必要があります。
しかし、Grafana CloudにはGrafana Mimirというサービスが付いています。これはPrometheus用の時系列データベースで、産業機器から取得したデータの保存に使うことができます。
Freeプランでは10kメトリック(測定点ではなく測定の種類)まで保存できますので、これを利用しない手はありません。
ただし、Freeプランのデータ保管期間は14日間です。(Proプラン以上では13か月間)
一方で技術的な問題もあります。Mimirが本来対象としているPrometheusはプル型のアーキテクチャ、つまりPrometheusサービスが主体となって監視対象へデータを取得しに来るというアーキテクチャなので、産業機器など直接Prometheusがアクセスできない場合には使うことができません。本当は産業機器側にあるコンピュータが主体となって測定データを送りたいわけです。
ところが、Grafana Cloudはその点も考えられていて、専用のプロキシサービスが用意されてあり、プッシュ型、つまり産業機器側が起点としてデータを送れるような仕組みを取れるようになっています。
これにはInfluxDBのLineプロトコルが使われていますので、テキスト形式でメジャーメント(測定の種類)、タグ(測定地点などのメタ情報)、フィールド(測定データ)、タイムスタンプを作り、HTTPSで送ればデータが記録されます。
繰り返すようですが、InfluxDBが動いているわけではなくMimirへ変換されて記録されるので、InfluxDBの仕組み(FluxやInfluxQL)でクエリできるわけではありません。
Node-RED
クライアントのプログラムはJavaScriptやPythonでもシェルスクリプトでも、データを取得してそれをHTTPS経由で転送できる言語であれば問題ありません。
今回はお手軽に試せるように、ハードウェアを扱うのに便利なローコードツールのNode-REDを使ってみました。
ハードウェア
測定機器として、Aliexpressで買ったHIKING DDS238-2 ZN/SRというスマートエネルギーメータ―を使用しました。
DDS238は電圧や電流、周波数、電力などを測定してModbus-RTU(RS485)で取得できます。
これを絶縁型USB-RS485アダプターでPCと接続しました。
PCにはIntel N95 CPUの格安ミニPCを使用し、OSにはUbuntu Desktop 24.04 LTSをインストールしました。
Node-REDは公式サイトの手順を参考にインストールしてください。
Grafan Cloudの設定
Grafana Cloudに新規登録してください。Freeプランで問題ありません。
この時注意する点として、現在のところ__日本リージョンではInfluxDB connectivityが使用できない__ため、他のリージョンを選択してください。私はUS Westリージョンを使用しました。
スタックを作成したら、メニューのスタック名をクリックし、"Manage your stack"ページを開きます。
最下部のInfluxDB connectivityのConfigureをクリックします。
Write EndpointとUsernameをメモしておきます。次にPassword/API tokenのGenerate nowをクリックします。
Create an API tokenのダイアログが開きますので、token nameに名前を付け、Create tokenをクリックしてトークンを生成します。トークンはここでしか表示できません。Node-REDで使用しますのでメモしておいてください。
Node-REDフロー
全体のフロー
2つのmodbusアドレスから電圧と周波数を取得し、それらの単位を加工、単一のメッセージを生成して送信するという処理です。
Modbusデバイス設定
シリアルポート名とボーレートを設定します。
私がハマった点があるのでメモすると、Ubuntuを使っている場合には、/dev/ttyUSB*
へアクセスできるのはdialout
グループに所属しているユーザーのみなので、sudo usermod -a -G dialout USERNAME
で追加する必要があります。
Modbus取得処理
DDS238-2はHolding Registersの13番に電圧、17番に周波数が含まれています。取得・送信間隔はPoll Rateで設定します。
joinノードで使用するのでトピックも記入しておきます。
値の加工
Modbusから取得できる値は整数値になっています。電圧は実際の値の10倍、周波数は100倍の値が入っているので、calculatorノードで元の値に復元します。
値の合成
送信するメッセージをまとめたいので、2つの値を単一のメッセージに合成します。
Functionノード
送信するメッセージを生成する処理です。
Node-REDではコードを書くことをあまり好まれないことがありますが、ごく簡潔な処理なのでJavaScriptで直接書いてしまいました。
日時と取得したデータ2つから送信するメッセージを整形する処理のみだけです。
messageはInfluxDBのLineプロトコルの形式で出力するようにします。
専用のライブラリも存在するので、Changeノードと組み合わせて完全ノーコードとすることも可能かもしれません(未検証です)
const dt = new Date().getTime();
const volt = msg.payload.volt;
const freq = msg.payload.freq;
const message = `Electric,point=東京 volt=${volt},freq=${freq} ${dt}`;
msg.payload = message
return msg
データの送信
HTTP requestノードでデータを送信します。
URLは以下の形式にします。
https://<InfluxDB connectivity Endpoint URL>/api/v1/push/influx/write?precision=ms
ユーザー名はGrafana CloudインスタンスのID(数値)、パスワードには生成したトークンを入力します。
ここまで設定出来たらデプロイして、エラーがないことを確認してください。
Grafanaダッシュボードの作成
送信されたデータを可視化するためには、Grafanaでダッシュボードを作成し、Visualizeを追加します。
データソースにはPrometheus(defaultと表示されています)を選択し、Metricのドロップダウンボックスを開くと、<measurement>_<field>
形式になった候補が表示されます。先ほどの例でいうとElectric_volt
とElectric_freq
が出てきます。
Labelにはtag
が出てきますので、point
に東京
を選びましょう。
同様の作業をfreqに対しても行い、色などを変更し完成したのが以下のダッシュボードです。
Prometheusデータソースのテクニック
これで一応は値が表示されるのですが、デフォルトでは1分毎にデータがまとめられて表示されてしまいます。
これを直すには、Optionを開き、Min step
をデータ取得間隔にします。今回は5秒毎に取得しているので5s
を入力します。(最小間隔は1s)
Prometheusでは存在しない時刻位置のデータについて、その点の前の最新の値が続いていると仮定して補完されるため、解像度を細かくするとかえって良い結果が得られないことがあります。
たとえば、今回は5秒毎にデータを取得していますが、Min stepを1sにすると1秒毎にデータが補完されてグラフの形が台形になってしまいます。
まとめ
今回はGrafana Cloudのみを使ってModbusで取得したデータを可視化してみました。
産業装置のデータ可視化するためのサーバのセットアップ不要で、しかも無料で気軽に始められるので、最初のステップとして挑戦されてみてはいかがでしょうか?
以上